package mlz.work;

import java.util.Random;
import java.util.Scanner;

/*
## 案例八：模拟双色球[拓展案例]

双色球彩票，由前区6个红球号码和后区1个蓝球号码组成。
前区6个红球号码是从1~33中选择;后区蓝球号码是从1~16中选择;而且前区6个红球号码是不能重复的。
编写程序，能够让用户录入一注双色球彩票;也可以随机产生一注双色球彩票

> 投注号码由6个红色球号码和1个蓝色球号码组成。红色球从1-33中选择，蓝色球号码从1-16中选择

需要使用3个方法完成:
1.让用户手动投注情况,生成一注双色球彩票
    1.方法是否需要参数传入?
        不需要传参,因为双色球的规则已经固定好了
    2.方法是否需要返回值?
        需要,返回一个数组.数组的长度就是双色球的总个数7个
    3.方法内部的业务逻辑
        1.需要准备一个int类型的数组,数组的长度为7,用于存储生成的投注号码
        2.遍历数组的前6个元素,用户使用控制台录入信息,给前6个红球赋值
        3.最后录入一个整数,给蓝球赋值


2.让系统随机生成一注双色球彩票号码
3.判断传入的两组号码,用于判断彩票的中奖情况
    1.方法是否需要参数传入?
        需要参数,参数为两个数组类型
    2.方法是否需要返回值?
        不需要,使用void
    3.方法内部的业务逻辑
        1.定义两个变量用来记录,红球redCount和蓝球blueCount的个数
        2.遍历两个数组中前6个元素(红球),判断两个数组中有没有相同的元素
            如果找到一个相同的元素则redCount++
        3.比较两个数组中最后一个元素(蓝球)是否想用
            如果相同则blueCount++
        4.根据红球和蓝球的命中个数,打印出对应的奖项



- 6个红球+1个蓝球 ，奖金1000万
- 6个红球+0个蓝球，奖金500万
-  5个红球+1个蓝球，奖金3000块
-  5个红球+0个蓝球，或者4个红球+1个蓝球，奖金200块
- 4个红球+0个蓝球，或者3个红球+1个蓝球，奖金10块
- 小于3个红球+1个蓝球，奖金5块
- 如果前面的都不成立，就中奖，算你为福利事业做贡献了。
 */
public class WorkDemo08 {
    public static void main(String[] args) {

        int[] answerNumber = answerNumber();
        printArray(answerNumber);//[33,30,16,24,19,15,1]

        int[] userNumber = userNumber();
        printArray(userNumber);

        contrast(userNumber,answerNumber);


    }

    
    //断传入的两组号码,用于判断彩票的中奖情况
    public static void contrast(int[] userNumbers, int[] answerNumbers){
        //1.定义两个变量用来记录,红球redCount和蓝球blueCount的个数
        int redCount = 0;
        int blueCount = 0;

        //先判断红球的命中的数量
        //遍历用户投注的号码的前6个红球
        for (int i = 0; i < userNumbers.length - 1; i++) {
            for (int j = 0; j < answerNumbers.length - 1; j++) {
                if (userNumbers[i] == answerNumbers[j]){
                    redCount++;
                    break;
                }
            }
        }
        //判断蓝球是否命中
        blueCount = userNumbers[6] == answerNumbers[6] ? 1 : 0;

        System.out.println("命中的红球数量:" + redCount);
        System.out.println("命中的蓝球数量:" + blueCount);

        //判断中奖的情况,并输出最终结果
        /*
        - 6个红球+1个蓝球 ，奖金1000万
        - 6个红球+0个蓝球，奖金500万
        -  5个红球+1个蓝球，奖金3000块
        -  5个红球+0个蓝球，或者4个红球+1个蓝球，奖金200块
        - 4个红球+0个蓝球，或者3个红球+1个蓝球，奖金10块
        - 小于3个红球+1个蓝球，奖金5块
        - 如果前面的都不成立，就中奖，算你为福利事业做贡献了。
         */
        if (redCount == 6 && blueCount == 1){
            System.out.println("奖金1000万");
        } else if (redCount == 6 && blueCount == 0) {
            System.out.println("奖金500万");
        }else if (redCount == 5 && blueCount == 1) {
            System.out.println("奖金3000块");
        }else if (redCount == 5 && blueCount == 0 || redCount == 4 && blueCount == 1) {
            System.out.println("奖金200块");
        }else if (redCount == 4 && blueCount == 0 || redCount == 3 && blueCount == 1) {
            System.out.println("奖金10块");
        }else if (redCount < 3 && blueCount == 1) {
            System.out.println("奖金5块");
        }else {
            System.out.println("没有中奖!!");
        }
    }


    //2.让系统随机生成一注双色球彩票号码
    public static int[] answerNumber(){
        //1.创建一个整数类型的数组,用于存储7个号码球
        int[] numbers = new int[7];

        //定义一个随机数对象
        Random r = new Random();
        //2.遍历前6个位置,依次随机一个红球号码存入 1~33之间 不重复
        for (int i = 0; i < numbers.length; i++) {
            while(true){
                //a.当前位置随机生成一个红球号码存入1~33之间
                int number = r.nextInt(33) + 1;
                //b.需要判断这个号码是否之前出现过(不重复)
                if (!exist(numbers,number)){
                    //number是不重复
                    numbers[i] = number;
                    break;//结束循环,代表找到了当前这个位置的一个不重复的红球号码
                }
            }
        }
        //3.生成最后一个蓝球 1-16
        numbers[numbers.length-1] = r.nextInt(16) + 1;
        return numbers;
    }







    //打印数组的方法
    public static void printArray(int[] arr){
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(i == arr.length - 1 ? arr[i] : arr[i] + ",");
        }
        System.out.print("]");
    }

    //让用户手动投注情况,生成一注双色球彩票
    /*
    1.需要准备一个int类型的数组,数组的长度为7,用于存储生成的投注号码
    2.遍历数组的前6个元素,用户使用控制台录入信息,给前6个红球赋值
    3.最后录入一个整数,给蓝球赋值
     */
    public static int[] userNumber(){
        //控制台对象
        Scanner sc = new Scanner(System.in);

        //1.需要准备一个int类型的数组,数组的长度为7,用于存储生成的投注号码
        int[] numbers = new int[7];
        //2.遍历数组的前6个元素,用户使用控制台录入信息,给前6个红球赋值
        for (int i = 0; i < numbers.length - 1; i++) {
            while(true){
                //i = 0 1 2 3 4 5
                //用户给当前位置上进行投注信息 1~33之间随机还不能重复
                System.out.println("请输入第:" + (i + 1) + "个红球号码:");
                int number = sc.nextInt();
                //判断用户输入的红球号码是否在 1 ~ 33之间
                if (number < 1 || number > 33){
                    System.out.println("对不起,您输入的号码不在1 ~ 33之间.");
                }else {
                    //如果号码是在1~33区间的,则需要判断当前号码是否重复,不重复才可以使用
                    if (exist(numbers,number)){
                        //number当前这个红色球号码重复了
                        System.out.println("对不起,您输入的号码重复了!");
                    }else {
                        //number当前这个红色球号码可以使用
                        numbers[i] = number;
                        break;//结束当次投注.
                    }
                }
            }
        }
        //投注最后一个蓝球号码
        while (true){
            System.out.println("请确认最后一个蓝球的号码(1-16):");
            int number = sc.nextInt();
            if (number < 1 || number > 16){
                System.out.println("对不起,您输入的号码不在范围之内");
            }else {
                numbers[6] = number;
                break;//注入成功,结束死循环
            }
        }
        return numbers;
    }

    //该方法判断这个号码是否在数组中存在,如果存在则返回true,如果不存在则返回false
    public static boolean exist(int[] numbers, int number){
        //需求: 判断number这个数字是否在数组numbers中存在
        for (int i = 0; i < numbers.length; i++) {
            if (numbers[i] == 0){
                break;
            }
            if (numbers[i] == number){
                return true;
            }
        }
        return false;
    }













}
